home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 27 / CU Amiga Magazine's Super CD-ROM 27 (1998)(EMAP Images)(GB)[!][issue 1998-10].iso / CUCD / PowerPC / vbcc / machines / amigawos / libsrc / stdio / fread.c < prev    next >
C/C++ Source or Header  |  1998-08-02  |  823b  |  44 lines

  1. #include <stdio.h>
  2. #include <errno.h>
  3.  
  4. size_t fread(void *ptr,size_t size,size_t nmemb,FILE *f)
  5. {
  6.   size_t cnt,total=size*nmemb;
  7.   char *p=ptr;
  8.   long result;
  9.  
  10.   if (!f) {
  11.     errno = EBADF;
  12.     return (0);
  13.   }
  14.   if ((f->flags&(_READABLE|_WRITE|_ERR|_EOF))!=_READABLE) {
  15.     errno = EBADF;
  16.     return (0);
  17.   }
  18.   f->flags |= _READ;
  19.   if (cnt=f->count) {
  20.     /* read buffer */
  21.     if (total<=cnt) {
  22.       memcpy(p,f->pointer,total);
  23.       f->pointer += total;
  24.       f->count -= total;
  25.       return (nmemb);
  26.     }
  27.     else {
  28.       memcpy(p,f->pointer,cnt);
  29.       total -= cnt;
  30.       p += cnt;
  31.       f->count = 0;
  32.     }
  33.   }
  34.   if ((result = _read(f->filehandle,p,total)) == EOF) {
  35.     f->flags |= _ERR;
  36.     return (0);
  37.   }
  38.   else if (result<total) {
  39.     f->flags |= _EOF;
  40.     return ((cnt+result)/size);
  41.   }
  42.   return (nmemb);
  43. }
  44.